package ph.com.gs3.sockettest;

import io.socket.IOAcknowledge;
import io.socket.IOCallback;
import io.socket.SocketIOException;

import org.json.JSONException;
import org.json.JSONObject;

import ph.com.gs3.sockettest.Manager.SocketIOCommunicatorModule;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {

	public static final String TAG = MainActivity.class.getSimpleName();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		if (savedInstanceState == null) {
			getFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment())
			        .commit();
		}

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	/**
	 * A placeholder fragment containing a simple view.
	 */
	public static class PlaceholderFragment extends Fragment {

		private Button sendButton;
		private EditText messagesEditText;

		private SocketIOCommunicatorModule socketIOCommModule;

		public PlaceholderFragment() {

			socketIOCommModule = new SocketIOCommunicatorModule();
			socketIOCommModule.initialize(ioCallbackImpl);
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
		        Bundle savedInstanceState) {
			View rootView = inflater.inflate(R.layout.fragment_main, container, false);

			messagesEditText = (EditText) rootView.findViewById(R.id.main_etMessages);

			sendButton = (Button) rootView.findViewById(R.id.main_bSendMessage);
			sendButton.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					socketIOCommModule.publishTestMessage();
					// socketCommModule.connect();

				}
			});

			return rootView;
		}

		public IOCallback ioCallbackImpl = new IOCallback() {

			@Override
			public void onMessage(JSONObject json, IOAcknowledge ack) {
				try {
					System.out.println("Server said:" + json.toString(2));
				} catch (JSONException e) {
					e.printStackTrace();
				}
			}

			@Override
			public void onMessage(String data, IOAcknowledge ack) {
				System.out.println("Server said: " + data);
			}

			@Override
			public void onError(SocketIOException socketIOException) {
				System.out.println("an Error occured");
				socketIOException.printStackTrace();
			}

			@Override
			public void onDisconnect() {
				System.out.println("Connection terminated.");
			}

			@Override
			public void onConnect() {
				System.out.println("Connection established");
			}

			@Override
			public void on(String event, IOAcknowledge ack, Object... args) {
				System.out.println("Server triggered event '" + event + "'");

				Log.v(TAG, args[0].toString());

				final String eventReference = event;
				final String message = args[0].toString();

				PlaceholderFragment.this.getActivity().runOnUiThread(new Runnable() {

					@Override
					public void run() {
						if ("recieve".equals(eventReference) && messagesEditText != null) {
							String previousText = messagesEditText.getText().toString();
							messagesEditText.setText(previousText + message + "\n");
						}
					}
				});

			}
		};
	}

}
